package com.io.istream;

import org.junit.Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Example01 {
    public static void main(String[] args) {
        System.out.println("输入流学习");
        try {
            FileInputStream fileInputStream = new FileInputStream("hello.txt");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    // 使用FileInputStream 读取文件
    // 方式一：逐个字节读取 read()方法
    @Test
    public void readFirst() {
        // 获取文件夹所在路径
        String path = new Example01().getClass().getResource("").getPath();
        // E:/JavaProject/java-learning-directory/out/production/CommonClass/com/io/istream/
        System.out.println(path);
        int readData = 0;
        // 全局使用
        FileInputStream fileInputStream = null;
        try {
            // 创建 FileInputStream 对象 用于读取文件
            fileInputStream = new FileInputStream(path+"hello.txt");
            /**
             * 使用read() 方法 ,读取一个字节的数据，单个字节读取，效率低
             * 一个一个字节的读取，所以是一个循环读取
             * 返回结果 下一个数据字节，或 返回-1表示到达了文件末尾 。
             * 读取的结果是一个int，所以需要转成 char类型显示
             *
             * 注意：这个是按照字节方式读取内容，读取中文是会乱码的。
             * 字节流:二进制文件  字符流：文本
             */
            while ((readData = fileInputStream.read()) != -1) {
                // 读取内容是int ，需要转成char字符内容输出
                System.out.print((char) readData);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭文件流，释放资源，避免资源浪费
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    // 方式二：每一次读取最大字节长度 read(byte[] b) 方法
    @Test
    public void readSecond() {
        // 年轻人 做了再说 总是幻想没有什么用的
        String path = new Example01().getClass().getResource("").getPath();
        System.out.println(path);
        int readData = 0;
        // 全局使用
        FileInputStream fileInputStream = null;
        // 定义一个一次性最多允许读取的字节数组
        byte[] b = new byte[8];
        try {
            fileInputStream = new FileInputStream(path + "hello.txt");
            /**
             * 使用 read(byte[] b) 读到 b.length从去取到字节到 数据数组。
             * 按照数组的长度进行最大长度读取字节
             * 返回读入缓冲的字节总数，返回 -1 表示读取内容结束
             * 比如：设定是 8，但是读取是6字节，就返回是6
             */
            while ((readData = fileInputStream.read(b)) != -1) {
                // 创建字符串 输出
                String s = new String(b, 0, b.length);
                System.out.print(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源流
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
